function password(rule, value, callback) {
  if (value == null || value === '') {
    callback(new Error('请输入密码'))
  } else if (value.length < 8 || value.length > 16) {
    callback(new Error('密码长度为：8~16位'))
  } else if (!new RegExp('^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$').test(value)) {
    callback(new Error('密码至少包含大小写字母、数字和特殊字符'))
  } else if (!new RegExp('.*[^A-Za-z0-9]+.*').test(value)) {
    callback(new Error('密码至少包含大小写字母、数字和特殊字符'))
  } else if (!new RegExp('^[^ ]+$').test(value)) {
    callback(new Error('密码不能包含空格'))
  }
  callback()
}

function code(rule, value, callback) {
  if (value == null || value == '') {
    callback(new Error('验证码不能为空'))
  } else if (!new RegExp('^[0-9]+$').test(value)) {
    callback(new Error('验证码只能为数字'))
  }
  callback()
}

function email(rule, value, callback) {
  if (value != null && value.length != 0) {
    if (
      !new RegExp(
        /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
      ).test(value)
    ) {
      callback(new Error('请输入正确的电子邮箱'))
    }
  }
  callback()
}

function phone(rule, value, callback) {
  if (value != null && value.length != 0) {
    if (
      !new RegExp(
        '^(0|86|17951)?(13[0-9]|15[012356789]|17[0135678]|18[0-9]|14[57])[0-9]{8}$'
      ).test(value)
    ) {
      callback(new Error('请输入正确的手机号码'))
    }
  }
  callback()
}

function imsi(rule, value, callback) {
  //		if(value != null && value.length != 0){
  //		}
  callback()
}

function userName(rule, value, callback) {
  if (value != null && value.length != 0) {
    if (!new RegExp('^[a-zA-Z0-9]{5,16}$').test(value)) {
      callback(new Error('用户名由字母，数字组成，长度5-16之间'))
    }
    if (/(^\_)|(\__)|(\_+$)/.test(value)) {
      callback(new Error("用户名首尾不能出现下划线'_'"))
    }
    if (!new RegExp('^[^ ]+$').test(value)) {
      callback(new Error('用户名不能包含空格'))
    }
  }
  callback()
}

function name(rule, value, callback) {
  if (value) {
    if (!new RegExp('^[a-zA-Z\u4e00-\u9fa5]{1,10}$').test(value)) {
      callback(new Error('姓名由汉字或字母组成,且长度不超过10'))
    }
  }
  callback()
}

function idCard(rule, value, callback) {
  if (value != null && value.length != 0) {
    let iSum = 0
    const aCity = {
      11: '北京',
      12: '天津',
      13: '河北',
      14: '山西',
      15: '内蒙古',
      21: '辽宁',
      22: '吉林',
      23: '黑龙江',
      31: '上海',
      32: '江苏',
      33: '浙江',
      34: '安徽',
      35: '福建',
      36: '江西',
      37: '山东',
      41: '河南',
      42: '湖北',
      43: '湖南',
      44: '广东',
      45: '广西',
      46: '海南',
      50: '重庆',
      51: '四川',
      52: '贵州',
      53: '云南',
      54: '西藏',
      61: '陕西',
      62: '甘肃',
      63: '青海',
      64: '宁夏',
      65: '新疆',
      71: '台湾',
      81: '香港',
      82: '澳门',
      91: '国外'
    }
    if (!/^\d{17}(\d|x)$/i.test(value)) {
      callback(new Error('你输入的身份证长度或格式错误'))
    }
    value = value.replace(/x$/i, 'a')
    if (aCity[parseInt(value.substr(0, 2))] == null) {
      callback(new Error('你的身份证地区非法'))
    }

    const sBirthday = value.substr(6, 4) + '-' + Number(value.substr(10, 2)) + '-' + Number(value.substr(12, 2))
    const d = new Date(sBirthday.replace(/-/g, '/'))
    if (
      sBirthday !=
      d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate()
    ) {
      callback(new Error('身份证上的出生日期非法'))
    }
    for (let i = 17; i >= 0; i--) {
      iSum += (Math.pow(2, i) % 11) * parseInt(value.charAt(17 - i), 11)
    }
    if (iSum % 11 != 1) {
      callback(new Error('你输入的身份证号非法'))
    }
  }
  callback()
}

function ipv4(rule, value, callback) {
  if (value != null && value.length != 0) {
    if (
      !new RegExp(/^((25[0-5]|2[0-4]\d|[01]?\d\d?)($|(?!\.$)\.)){4}$/).test(
        value
      )
    ) {
      callback(new Error('错误的IPV4地址格式'))
    }
  }
  callback()
}

function lon(rule, value, callback) {
  if (
    !new RegExp(
      /^-?((0|1?[0-7]?[0-9]?)(([.][0-9]{1,6})?)|180(([.][0]{1,6})?))$/
    ).test(value)
  ) {
    callback(new Error('请输入正确的经度'))
  }
  callback()
}

function lat(rule, value, callback) {
  if (
    !new RegExp(
      /^-?((0|[1-8]?[0-9]?)(([.][0-9]{1,6})?)|90(([.][0]{1,6})?))$/
    ).test(value)
  ) {
    callback(new Error('请输入正确的纬度'))
  }
  callback()
}

function number(rule, value, callback) {
  if (value) {
    const min = rule.min;
    const max = rule.max;
    let msg = '';
    if (min != null && max != null) {
      msg = 'from ' + min + ' to ' + max;
    } else if (min != null && max == null) {
      msg = 'more than or equal to' + min;
    } else if (min == null && max != null) {
      msg = 'less than or equal to' + max + '的';
    }
    const error = new Error('Please enter an integer ' + msg);
    const num = parseInt(value);
    if (isNaN(num)) {
      callback(error);
    }
    if (min !== null && num < min) {
      callback(error);
    }
    if (max !== null && num > max) {
      callback(error);
    }
  }
  callback();
}

export {
  password,
  code,
  email,
  phone,
  imsi,
  userName,
  name,
  idCard,
  ipv4,
  lon,
  lat,
  number
}
